import json
import textwrap
import time

from flask import jsonify, request, Response, session
from langchain_text_splitters import RecursiveCharacterTextSplitter
from redis import Redis

from myApp.model.case_model import CaseDocument
from myApp.model.message_model import Message

from myApp.model.room_model import Room
from flask import Blueprint

# from myApp.utils.FuZiModel import model, tokenizer, run_fuzi
# from myApp.utils.ChatGlmModel import run_glm
from myApp.utils.ApiModel import ollama_chat, fuzi_chat, fuzi_stop, ollama_chat_all

from myApp.utils.ChatGlmModel import run_glm_all, run_glm

# redis_client = Redis(host='10.206.60.14', port=6379, db=0, decode_responses=True)
redis_client = Redis(host='127.0.0.1', port=6379, db=0, decode_responses=True, password='vsoft@123&')
# redis_client = Redis(host='127.0.0.1', port=6379, db=0, decode_responses=True)

task_1_prompt = """
请基于Elasticsearch检索的需求，分析提供的案件描述，并完成以下任务：

1. 确定案件描述中的主要争议焦点。
2. 提取案件描述中的核心事实。
3. 列出与案件描述内容相关的关键词。

案件描述内容：
[@用户输入@]

请根据上述指示，输出以下信息，仅以JSON格式，确保输出结构清晰且信息完整：

{
  "DisputeFocus": "在此填入文本中的主要争议焦点，用一句话清晰表达",
  "CoreFacts": "在此总结文本中描述的核心事实，尽量用简洁的语言表达。",
  "Keywords": [
    "关键词1",
    "关键词2",
    // 根据文本内容添加更多关键词，确保关键词与案件相关且具有辅助检索的价值"
  ]
}

请注意：输出仅限JSON格式，不包含其他任何解释或文本内容。
"""



task_1_text = """
- 根据您提供的信息，本案主要争议焦点为：`@DisputeFocus@`
    
- 案件描述中的核心事实为：`@CoreFacts@`
    
- 与案件描述内容相关的关键词有：`@Keywords@`

"""

task_2_prompt = """
请阅读以下两个司法案例的描述，并简要分析它们之间的主要相似点和差异点。专注于案例的法律背景、涉及的当事人、事件地点和时间、以及判决结果等关键方面。

案例A：
[@用户输入@]

案例B：
[@检索事件@]

您需要使用MarkDown列表格式列出相似点和差异点，具体格式如下：

- **相似点**：
    - 相似点1
    - 相似点2
    - ...

- **差异点**：
    - 差异点1
    - 差异点2
    - ...

请保持您的分析简洁明了，直接列出关键对比点，无需详细描述。
注意不要输出：```markdown

"""




task_2_prompt_splitter = """
用三句话概括三引号内的文本，100字以内。
\"\"\"@案件文档@\"\"\"
"""




def is_json(myjson):
    try:
        json_object = json.loads(myjson)
    except json.JSONDecodeError:  # 对于Python3.6及之后的版本，使用json.JSONDecodeError
        return False
    except ValueError as e:  # 对于Python3.5及之前的版本，使用ValueError
        return False
    return True


def case_model(text, assistant_message_id):
    while True:
        task_1_response = run_glm_all(task_1_prompt.replace("@用户输入@", text), assistant_message_id)

        # task_1_response = run_glm_all(task_1_prompt.replace("@用户输入@", text), assistant_message_id, model_name)
        task_1_response = task_1_response.replace("```json", "").replace("```", "")
        if not is_json(task_1_response):
            print("不是json")
            print(task_1_response)
            continue
        task_1_json = json.loads(task_1_response)
        break

    dispute_focus = task_1_json["DisputeFocus"]
    core_facts = task_1_json["CoreFacts"]
    keywords = task_1_json["Keywords"]
    response = task_1_text.replace("@DisputeFocus@", dispute_focus).replace("@CoreFacts@", core_facts).replace(
        "@Keywords@",
        "" + "、".join(keywords) + "")
    yield json.dumps({'text': response}) + "&&##&&"

    case_page_info, _ = CaseDocument.search_page(task_1_response, 1, 2, 1)
    i = 1
    for case_info in case_page_info:
        stop_stream = redis_client.get(assistant_message_id)
        if stop_stream == "end":
            break

        task_2_docs = textwrap.wrap(case_info.full_text, 5000)
        task_2_array = []

        keywords_string = "/".join(keywords)
        yield json.dumps({
            'text': f"### [{i}. {case_info.case_name}](caseDetail?"
                    f"caseId={case_info.id})\n"}) + "&&##&&"

        for doc in task_2_docs:
            stop_stream = redis_client.get(assistant_message_id)
            if stop_stream == "end":
                break
            res = run_glm_all(task_2_prompt_splitter.replace("@案件文档@", doc), assistant_message_id)
            task_2_array.append(res)
            # print(res)
        task_2_prompt_1 = task_2_prompt.replace("@检索事件@", "。".join(task_2_array)).replace("@用户输入@", text)
        for data in run_glm(task_2_prompt_1, assistant_message_id):
            yield data  # 直接传递 run_glm 生成的每个字节流项
        #     分割案例
        yield json.dumps({'text': "\n\n"}) + "&&##&&"
        i += 1
        # 显示3个案例
        if i == 3:
            break
    # 更多案例
    yield json.dumps({
        'text': f"\n\n[更多案例 >](searchCase?"
                f"DisputeFocus={dispute_focus}&CoreFacts={core_facts}"
                f"&Keywords={keywords_string})\n"}) + "&&##&&"
